-- $Name: Лидия$
-- $Author: Василий Воронков$
-- $Version: 1.3$
-- $E-mail: basil@voronkov.name$

instead_version "1.9.0"
dofile "lib/parsec.lua"
dofile "game/common.lua"
dofile "game/prologue.lua"
dofile "game/episode01.lua"
dofile "game/episode02.lua"
dofile "game/episode03.lua"
dofile "game/episode04.lua"
dofile "game/episode05.lua"
dofile "game/episode06.lua"
dofile "game/episode07.lua"
dofile "game/episode08.lua"
dofile "game/episode09.lua"
dofile "game/episode10.lua"
dofile "game/episode11.lua"
dofile "game/episode12.lua"
dofile "game/episode13.lua"
dofile "game/episode14.lua"
dofile "game/episode15.lua"
dofile "game/episode16.lua"
dofile "game/episode17.lua"
dofile "game/episode18.lua"
dofile "game/episode19.lua"
dofile "game/episode20.lua"
dofile "game/episode21.lua"
dofile "game/episode22.lua"
dofile "game/episode23.lua"
dofile "game/episode24.lua"
dofile "game/episode25.lua"
dofile "game/episode26.lua"
dofile "films.lua"
require "kbd"
hook_keys("f5", "f6");

function verb_promos()
  if did_beatgame() then
    return "дополнительные материалы";
  end
end

main = scene {
   bg           = "kril"
  ,nosort       = true
  ,dsc          = concat_ {
                    "^"..
                    img("gfx/lydia.jpg")..
                    [[^интерактивная повесть
                      ^
                      ^Версия: 1.3
                      ^Платформа INSTEAD и модуль Метапарсер: Пётр Косых
                      ^Сценарий и программирование игры: Василий Воронков
                      ^Музыка: Василий Воронков
                      ^Бета-тестирование: Николай Коновалов
                      ^
                      ^Исходный код игры доступен под лицензией GNU GPL v2. Музыка и 
                      графика доступны под лицензией Creative Commons. Художественные тексты
                      являются собственностью автора и защищены законом об авторском праве.
                      ^Москва, 2013 г.
                    ]],
                    if_("did_beatgame()",
                      "^^^" ..
                      imgl("pad:0 10 0 0,gfx/gold.png")..
                      txtb("Игра пройдена целиком^") ..-- за: ") .. txtb(tostring(get_lasttime())) .. txtb("^") ..
                      txtb("Открыты дополнительные материалы^")
                      )
                  }
  ,Newgame      = walk_("gamestart")
  ,Howto        = walk_("howto1")
  ,Creators     = walk_("credits")
  ,Promos       = walk_("extras")
  ,verbs        = {
                     { "Newgame", "играть", "{}" }
                    ,{ "Howto", "как играть", "{}" }
                    ,{ "Creators", "создатели", "{}" }
                    ,{ "Promos", verb_promos, "{}" }
                  }
}

howto1 = scene {
   nosort       = true
  ,bg           = "bg"
  ,dsc          = title:txt("Как играть. Часть 1", "white")..
                  [[^^В "Лидии" взаимодействие игрока с окружением осуществляется путём ввода команд с клавиатуры.
                    Такие игры обычно называются текстовыми, или парсерными. Однако, в отличие от традиционных
                    текстовых игр, "Лидия" предоставляет упрощённый интерфейс текстового ввода и строку автодополнения,
                    которые значительно упрощают игровой процесс.^^
                    В "Лидии" содержатся загадки, а также ситуации, в которых вам придётся совершать выбор, однако
                    игра обладает невысоким уровнем сложности, стараясь взамен рассказать вам интересную и напряжённую
                    историю, в событиях которой вы можете принять непосредственное участие. Прохождение "Лидии" займёт
                    у вас от четырёх до шести часов в зависимости от манеры вашей игры. Я же советую вам не торопиться,
                    а внимательно изучать окружение -- это поможет вам лучше понять происходящее в игре.^^
                    Управлении в "Лидии" ориентировано на использование клавиатуры; мышка вам в процессе игры, скорее
                    всего, не понадобится. Введите любую букву, и игра покажет вам список действий, доступных в текущей
                    сцене, которые начинаются на эту букву; если же действий, начинающихся на введённую букву, нет, то
                    в нижней строке отобразится знак вопроса. По мере ввода список внизу будет сокращаться,
                    отображая только доступные действия. После того, как вы выберете, что именно хотите сделать, появится список
                    предметов, к которым это действие можно применить. Например, вы можете <i>осмотреть себя</i>, или
                    <i>открыть дверь</i>.^^
                    Иногда вам придётся составлять более сложные действия -- например, некоторые двери можно открыть только
                    ключом, а какие-то вещи лучше осматривать через лупу или даже в микроскоп. Однако игра всегда будет
                    подсказывать вам, какие предметы вы можете применять в той или иной ситуации -- например, чем можно попытаться
                    открыть дверь, а что лучше просто бросить в стену. Кстати, предметы, которые вы носите с собой, отмечаются
                    в строке автодополнения курсивом, а их полный список можно вывести, <i>осмотрев себя</i>.^^
                    Далее рассказывается о некоторых маленьких хитростях, которые помогут вам при игре.]]
  ,verbs        = { 
                     { "Next", "дальше", "{}" }
                    ,{ "Back", "вернуться", "{}" }
                  }
  ,Back         = walk_("main")
  ,Next         = walk_("howto2")
}

howto2 = scene {
   bg           = "bg"
  ,dsc          = title:txt("Как играть. Часть 2", "white").."^^"..
                  img("pad:0 0 5 0,gfx/tab.jpg")..
                  [[^Как уже было сказано, в "Лидию" проще всего играть, используя только клавиатуру. Вместо того, чтобы щёлкать
                    мышкой на слова в строке автодополнения, лучше нажимайте на клавишу ]]..txtb("TAB")..[[, и наиболее подходящее
                    слово будет сразу же подставлено в строку ввода.]]..
                  "^^"..
                  img("pad:0 0 5 0,gfx/enter.jpg")..
                  [[^Для того, чтобы игра выполнила (или попыталась выполнить) предложенное вами действие, нажимайте клавишу ]]..
                  txtb("Enter").. [[. При этом, если  какое-то действие можно совершить только в отношении одного объекта, вам
                  необязательно вводить команду целиком -- смело жмите ]]..txtb("Enter")..[[ сразу, а игра сама разберётся, что именно нужно сделать.]]..
                  "^^"..
                  img("pad:0 10 5 0,gfx/f5.jpg")..img("pad:0 0 5 0,gfx/f6.jpg")..
                  [[^"Лидия" автоматически сохраняет ваш прогресс при выходе, но вы также можете сохраняться вручную, используя один
                    из доступных слотов сохранения. Для сохранения нажимайте ]]..txtb("F5")..[[, а для загрузки -- ]]..txtb("F6")..[[.]]..
                  "^^"..
                  img("pad:0 0 5 0,gfx/esc.jpg")..
                  [[^Вы также можете вызвать системное меню игры, нажав на клавишу]]..txtb("Esc")..[[. Системное меню позволяет открывает
                    вам доступ к настройкам, где вы можете, к примеру, изменить уровень громкости музыки и звуковых эффектов в игре. Также
                    через системное меню вы можете загрузить другие игры для платформы INSTEAD (http://instead.syscall.ru).]]
  ,verbs        = { { "Back", "вернуться", "{}" } }
  ,Back         = walk_("main")
}

credits = scene {
   bg           = "bg"
  ,dsc          = title:txt("Создатели", "white")
  ,obj          = { "credits_obj" }
  ,verbs        = { { "Back", "вернуться", "{}" } }
  ,Back         = walk_("main")
}

credits_obj = item {
   dsc          = [[Платформа INSTEAD и модуль Мета-парсер: Пётр Косых^
                    Сценарий и программирование игры: Василий Воронков (basil@voronkov.name)^
                    Музыка: Василий Воронков^
                    Бета-тестирование: Николай Коновалов^^
                    
                    Фотографии, использованные при оформлении игры:^
                    flickr.com^^
                    
                    Звуковые эффекты:^
                    freesound.org^^
                                     
                    Музыка создавалась в Garage Band, Alchemy и Audacity^
                    Графика обрабатывалась в Paint.NET и Gimp^
                    Код писался в Programmer's Notepad (http://pnotepad.org)^^
                    
                    Дополнительную информацию см. в файле <i>readme.txt</i>, который должен прилагаться к игре.]]
}

extras = scene {
   bg           = "posters/eye"
  ,nosort       = true
  ,dsc          = title:txt("Дополнительные материалы", "white")..
                  "^Достижения игры, музыкальные композиции, анимированная галерея артов, фильмотека, статистика"
  ,Arts         = walk_("promos")
  ,Back         = walk_("main")
  ,Music        = walk_("musicbox")
  ,Achievs      = walk_("achievs")
  ,Stats        = walk_("gamestat")
  ,Films        = walk_("films")
  ,verbs        = {
                     { "Achievs", "достижения", "{}" }
                    ,{ "Arts", "сюжетные арты", "{}" }
                    ,{ "Music", "музыка", "{}" }
                    ,{ "Stats", "статистика", "{}" }
                    ,{ "Films", "фильмотека", "{}" }
                    ,{ "Back", "вернуться", "{}" }
                  }
}

films = scene {
   nosort       = true
  ,bg           = "films"
  ,dsc          = title:txt("Фильмотека", "white")
  ,obj          = {
                     "f_opentitle"
                    ,"f_morning"
                    ,"f_holo"
                    ,"f_kz"
                    ,"f_endtitles"
                    ,"f_stars"
                    ,"f_orbit"
                    ,"f_ahill"
                  }
  ,verbs        = {
                     { "Open %2", "смотреть", verb_with_obj_("им") }
                    ,{ "Back", "вернуться", "{}" }
                  }
  ,Back         = walk_("extras")
}

films_transfer = pause {
   bg           = "bg"
  ,time         = 1
  ,walk         = function(s)
                    walk_(s.next)();
                  end
}

function flm(nam, room)
  return item {
    nam = nam,
    Open = function(s)
      films_transfer.next=room;
      walk_(films_transfer)();
      return "";
    end
  }
end

f_opentitle = flm("Заставка", "films_opentitle");
f_morning = flm("Утро", "films_morning");
f_holo = flm("Голограмма", "films_holo");
f_kz = flm("Элерия", "films_kz");
f_endtitles = flm("Титры", "films_endtitles");
f_stars = flm("Звёзды", "films_stars");
f_orbit = flm("Орбита", "films_orbit");
f_ahill = flm("Ахилл", "films_ahill");

achievs = scene {
   _open        = ""
  ,bg           = "bg"
  ,nosort       = true
  ,dsc          = title:txt("Достижения", "white")
  ,obj          = {
                     "a_recursion"
                    ,"a_square"
                    ,"a_protest"
                    ,"a_student"
                    ,"a_photo"
                    ,"a_internet"
                    ,"a_aggression"
                    ,"a_cubrick"
                    ,"a_shoot"
                    ,"a_cube"
                    ,"a_endsimulation"
                  }
  ,verbs        = {
                     { "Open %2", "смотреть", verb_with_obj_("им") }
                    ,{ "Back", "вернуться", "{}" }
                  }
  ,Back         = chain_ {
                    function(s) s._open="" end,
                    walk_("extras")
                  }
}
function achiv_item(tab)
  tab.nam = tab.tit;
  tab.dsc = function(s)
    local c = "gray";
    local im = img("gfx/stop.jpg");
    if unlocked(s.akey) then
      c = "white";
      im = img("gfx/"..s.img..".jpg");
    end
    local ret = im.." "..fbold:txt(s.tit, c);
    if s.akey==achievs._open then
      ret = ret.."^"..fitalic:txt(s.det, c);
    end
    return ret.."^^";
  end
  tab.Open = function(s)
    achievs._open = s.akey;
    walk_("achievs")();
  end
  return obj(tab);
end
a_recursion = achiv_item {
   akey         = "recursion"
  ,img          = "a_sphere"
  ,tit          = "Рекурсия"
  ,det          = [[Посмотрите на зелёное пятно, посмотрите на зелёное пятно, посмотрите на зелёное пятно...]]
}
a_square = achiv_item {
   akey         = "square"
  ,img          = "a_square"
  ,tit          = "Я выбираю квадрат!"
  ,det          = [[Выберите карту с изображением квадрата на психологическом тесте в институте.]]
}
a_protest = achiv_item {
   akey         = "protest"
  ,img          = "a_triangle"
  ,tit          = "Неподчинение"
  ,det          = [[Не подчиняйтесь роботу и не кладите куб на лоток на двери.]]
}
a_student = achiv_item {
   akey         = "student"
  ,img          = "a_sphere"
  ,tit          = "Примерный студент"
  ,det          = [[Дождитесь конца лекции Соколовского вместо того, чтобы убегать во время трансляции фильма.]]
}
a_photo = achiv_item {
   akey         = "photo"
  ,img          = "a_sphere"
  ,tit          = "Фотолюбитель"
  ,det          = [[Сделайте все возможные фотографии во время свидания с Лидией на берегу реки.]]
}
a_internet = achiv_item {
   akey         = "internet"
  ,img          = "a_square"
  ,tit          = "Интернет-зависимость"
  ,det          = [[Прочитайте все новости на институтском портале во время лекции Соколовского.]]
}
a_aggression = achiv_item {
   akey         = "aggression"
  ,img          = "a_triangle"
  ,tit          = "Необоснованная агрессия"
  ,det          = [[Нападите на Таис, когда она придёт к вам в камеру.]]
}
a_cubrick = achiv_item {
   akey         = "cubrick"
  ,img          = "a_sphere"
  ,tit          = "Дела подождут"
  ,det          = [[Сходите в кубрик к Лидии на "Ахилле", несмотря на срочные дела.]]
}
a_shoot = achiv_item {
   akey         = "shoot"
  ,img          = "a_triangle"
  ,tit          = "Побег любой ценой!"
  ,det          = [[Попытайтесь застрелить Таис из тазера во время побега.]]
}
a_cube = achiv_item {
   akey         = "cube"
  ,img          = "a_square"
  ,tit          = "Вселенная в геометрии Раймана"
  ,det          = [[Найдите куб с проекцией вселенной в геометрии Раймана во время побега.]]
}
a_endsimulation = achiv_item {
   akey         = "endsimulation"
  ,img          = "a_triangle"
  ,tit          = "Аварийный выход"
  ,det          = [[Завершите историю... особенным способом.]]
}

musicbox = scene {
   _music       = ""
  ,bg           = "bg"
  ,nosort       = true
  ,dsc          = title:txt("Музыкальные композиции", "white")
  ,obj          = {
                     "mb_morning"
                    ,"mb_day"
                    ,"mb_droplet"
                    ,"mb_droplet2"
                    ,"mb_macros"
                    ,"mb_oasis"
                    ,"mb_orbit"
                    ,"mb_spring"
                    ,"mb_stabat"
                    ,"mb_keys"
                    ,"mb_electronica"
                    ,"mb_bonus"
                  }
  ,Back         = chain_ {
                    mute_(3000),
                    function(s) s._music="" end,
                    walk_("extras")
                  }
  ,verbs        = {
                     { "PlayMusic %2", "играть", verb_with_obj_("им") }
                    ,{ "Back", "вернуться", "{}" }
                  }
}
local mbcount = 0;
function mb_song(nam, len, mus, txt)
  mbcount=mbcount+1;
  return item {
    nam = nam,
    num = mbcount,
    dsc = function(s)
      local ret = tostring(s.num)..". "..txtb("\""..nam.."\"")..". Продолжительность: "..len ..
        txtb(nvl(txt,""));
      if musicbox._music==mus then
        return img("gfx/play.jpg")..ret.." "..img("gfx/playing.gif").."^^";
      else
        return img("gfx/stop.jpg")..ret.."^^";
      end
    end,
    PlayMusic = function(s)
      here()._music=mus;
      play_music(mus,0);
      walk_(musicbox)();
      return "";
    end
  }
end
mb_morning = mb_song("Утро", "00:39", "morning");
mb_day = mb_song("День", "00:44", "day");
mb_droplet = mb_song("Дробь", "00:46", "droplet");
mb_droplet2 = mb_song("Быстрая дробь", "00:44", "droplet2");
mb_macros = mb_song("Макрос", "01:04", "macros");
mb_oasis = mb_song("Оазис", "01:20", "oasis");
mb_orbit = mb_song("Орбита", "00:25", "orbit_alt");
mb_spring = mb_song("Струна", "01:00", "spring");
mb_stabat = mb_song("Набат", "01:00", "stabat");
mb_keys = mb_song("Тьма", "00:27", "keys");
mb_electronica = mb_song("Электроника", "00:43", "electronica");
mb_bonus = mb_song("Дали", "01:50", "dali", ". Бонусный трек!");

promos = gfxroom {
   bg           = "bg"
  ,enter        = music_("oasis",2)
  ,ontimer      = function(s)
                    if s._pic == nil then
                      s._pic = 1;
                      s._step = 1;
                    end
                    if s._y == nil then
                      s._y = 600;
                    end
                    if s._y <= -200 then
                      s._y = 600;
                      s._pic = s._pic + 1;
                      s._step = 1;
                      s:cleancache();
                    end
                    local pp = s.pics[s._pic];
                    if pp ~= nil then
                      drawing.clean(s.pic, 200, s._y, 400, 287);
                      local gfx = s:loadgfx(pp);
                      sprite.copy(gfx, s.pic, 200, s._y);
                      s._y = s._y - s._step;
                      if s._y < 200 then
                        s._step = 8;
                      end
                    end
                  end
  ,pics         = {
                     "posters/title"
                    ,"posters/poster1"
                    ,"posters/poster2"
                    ,"posters/poster3"
                    ,"posters/poster4"
                    ,"posters/poster5"
                    ,"posters/poster6"
                    ,"posters/poster7"
                    ,"posters/poster8"
                    ,"posters/poster9"
                    ,"posters/poster10"
                  }
  ,stop         = 5000
  ,next         = walk_("extras")
  ,dispose      = chain_ {
                    nil_("_y"),
                    nil_("_step"),
                    nil_("_pic"),
                    mute_(3000,2000)
                  }
  ,rate         = 30
}

gamestat = scene {
   nosort       = true
  ,bg           = "bg"
  ,dsc          = title:txt("Статистика", "white")
  ,obj          = { "gamestat_obj" }
  ,Back         = walk_("extras")
  ,verbs        = { { "Back", "вернуться", "{}" } }
}

gamestat_obj = item {
  dsc           = function(s)
                    prefs:load();
                    pn("Количество полных прохождений: "..tostring(prefs["games"])..".");
                    --pn("Время последнего полного прохождения: "..prefs["lasttime"]);
                    pn("");
                    pn(txtb("Статистика по последнему прохождению:"));
                    pn("Осмотрели предметов: "..getstat("exams")..".");
                    pn("Попытались взять предметы: "..getstat("takes")..".");
                    pn("Разбрасывались вещами: "..getstat("throw")..".");
                    pn("Перемещались в пространстве: "..getstat("walks")..".");
                    pn("Попытались напасть: "..getstat("attacks")..".");
                    pn("Попытались сломать предметы: "..getstat("wrecks")..".");
                    pn("Поиграли в хакера: "..getstat("cracks")..".");
                    pn("Попытались включить или выключить устройства: "..getstat("activs")..".");
                    pn("Попытались передвинуть предметы: "..getstat("move")..".");
                    pn("Участвовали в беседах: "..getstat("talks")..".");
                    pn("Попытались вспомнить или подумать о чём-либо: "..getstat("think")..".");
                    pn("Попытались сесть на разные предметы: "..getstat("sits")..".");
                    pn("Попытались лечь на разные предметы: "..getstat("lies")..".");
                    pn("Попытались встать на ноги: "..getstat("stands")..".");
                    pn("Кричали: "..getstat("cry")..".");
                    pn("Озирались: "..getstat("around")..".");
                    pn("Ждали и бездействовали: "..getstat("wait")..".");
                    pn("Нажимали на кнопки: "..getstat("press")..".");
                    pn("Осматривались: "..getstat("look")..".");
                    p("Завершили нейросимуляций: "..getstat("rets")..".");
                  end
}

gamestart = pause {
   bg           = "bg"
  ,time         = 3000
  ,fading       = 30
  ,next         = chain_ {
                    walk_("entrance1")
                  }
}
